/*
 * Powered By XY
 * Since 2020
 */

package com.xy.biz.ts.service;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.xy.biz.base.domain.resp.ListDictItemResponse;
import com.xy.biz.ts.domain.bo.TrainUserBO;
import com.xy.biz.ts.domain.converter.TrainConverter;
import com.xy.biz.ts.domain.query.TrainFlowHandleQuery;
import com.xy.biz.ts.domain.query.TrainUserQuery;
import com.xy.biz.ts.domain.req.*;
import com.xy.biz.ts.domain.resp.GetTrainByClassifyResponse;
import com.xy.biz.ts.domain.resp.GetTrainResponse;
import com.xy.biz.ts.domain.resp.GetTrainUserResponse;
import com.xy.lang.domain.KeyValue;
import com.xy.lang.domain.Page;
import com.xy.lang.domain.Result;
import com.xy.biz.ts.domain.bo.TrainBO;
import com.xy.biz.ts.domain.query.TrainQuery;

/**
 *
 *
 * @author wwj
 * @date 2021-4-1
 */
public interface TrainService {

    /**
     * 保存
     *
     * @param trainBO
     */
    Result<?> saveTrain(TrainBO trainBO);

    /**
     * 第一次审核
     *
     * @param request
     */
    Result<?> auditTrain1(HandleTrainFlowRequest request);

    /**
     * 第二次审核
     *
     * @param request
     */
    Result<?> auditTrain2(HandleTrainFlowRequest request);

    /**
     * 第三次审核
     *
     * @param request
     */
    Result<?> auditTrain3(HandleTrainFlowRequest request);

    /**
     * 流程终止
     *
     * @param request
     */
    Result<?> finishTrainFlow(GetTrainRequest request);

    /**
     * 待办事项
     *
     * @param query 查找条件
     */
    Page<GetTrainResponse> searchTrainFlowTodo(TrainFlowHandleQuery query);

    /**
     * 保存多个
     *
     * @param collection
     */
    Result<?> saveAllTrain(Collection<TrainBO> collection);

    /**
     * 更新
     *
     * @param trainBO
     */
    Result<?> updateTrain(TrainBO trainBO);

    /**
     * 更新培训状态
     *
     */
    Result<?> changeStatus();

    /**
     * 删除
     *
     * @param trainId
     */
    Result<?> deleteTrain(Long trainId);

    /**
     * 查找一个
     *
     * @param trainId
     * @return
     */
    TrainBO getTrain(Long trainId);

    /**
     * 查找多个
     *
     * @param collection 标识集合
     */
    List<TrainBO> listTrainById(Collection<Long> collection);

    /**
     * 查找多个
     * @param request 标识集合
     */
    List<GetTrainResponse> listTrainByFlow(ListTrainRequest request);

    /**
     * 查找多个
     */
    List<TrainBO> listTrain(TrainQuery query);

    /**
     * 查找多个
     *
     */
    List<TrainBO> listPracticalOperation(TrainQuery query);

    /**
     * 我参与的
     */
    List<GetTrainResponse> listParticipantTrain(TrainQuery query);

    /**
     * 统计个数
     *
     * @param query 查找条件
     */
    int countTrain(TrainQuery query);

    /**
     * 获取培训分类
     */
    List<KeyValue> listTrainClassify();

    /**
     * 获取分类下的培训
     */
    List<GetTrainResponse> listTrainByClassify(TrainQuery query);
    List<TrainUserBO> listRecordByTrain(TrainUserQuery query);

    /**
     * 我培训的
     */
    List<GetTrainResponse> listMyTraining(TrainQuery query);

    /**
     * 获取培训发行人
     */
    List<GetTrainUserResponse> listReleaseUserByTrain(TrainUserQuery query);

    /**
     * 获取培训发行人
     */
    Result<?> remindTest(SendToUserRequest request);
}
